package com.sfx.concurrent.demo.concurrent.ReentrantReadWriteLock.cacheData;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: sfx
 * Date: 2023-04-17
 * Time: 12:12
 */

public class CacheData {
    private Object data;

    //缓存是否有效
    private volatile boolean cacheValid;
    //读写锁
    final ReentrantReadWriteLock rw = new ReentrantReadWriteLock();

    public void processCacheData() {
        rw.readLock().lock();//读加锁,不被其他写的线程所干扰,保证数据的一致性
        if(!cacheValid) {//缓存失效了
            //需要重建缓存,读锁不能重入写锁,不能升级,但是可以降级
            rw.readLock().unlock();//先要释放读锁
            rw.writeLock().lock();//加上写锁
            try {
                //判断是否有其他线程,获取了写锁,更新了缓存,进行双重校验,不要重复更新
                if(!cacheValid) {
                    //缓存仍然是失效的,那么更新
                    data = 999;
                    cacheValid = true;
                }
                //缓存更新完成,加上读锁,这是为了释放写锁的时候就能够让其他线程拥有读写缓存了
                //嗯
                //写锁-->降级为读锁是可以的
                rw.readLock().lock();
            }finally {
                //写锁释放
                rw.writeLock().unlock();
            }
        }
        try {//缓存没有失效就使用数据
            use(data);
        }finally {
            rw.readLock().unlock();;
        }
    }
    private Object use(Object data) {
        return data;
    }
}